#include "server.h"
#include "dbManager.h"
#include "en_decode.h"

using namespace hv;
using namespace std;


Server::Server() : m_server(&m_router)
{
    m_router.POST("/register", &user_register);
    m_router.POST("/login", &user_login);
    
    m_server.setPort(8080);
    m_server.setThreadNum(4);
    m_server.run();
}

Server::~Server()
{

}


int user_register(const HttpContextPtr& ctx)
{
    // 1. 获取到注册信息
    auto str = ctx->body();

    // 2. 解密注册信息
    auto out = base64_decode(str);
    Json obj;
    string err;
    int ret = parse_json(out.c_str(), obj, err);
    cout << obj << endl;

    // 3. 查询数据中该用户是否存在，存在返回错误，不存在则插入数据库
    // 4. 返回注册消息
    if(DBAPP->isUserExist(obj["user"])) {
        string str("{\"result\": false, \"msg\": \"user is exists\"}");
        auto out = base64_encode(str);
        return ctx->send(out.c_str(), ctx->type());
    }
    else {
        if(DBAPP->registerUser(obj["user"], obj["password"], obj["phone"], obj["email"], obj["date"])) {
        string str("{\"result\": true, \"msg\": \"register successful\"}");
        auto out = base64_encode(str);
            return ctx->send(out.c_str(), ctx->type());
        }
        else {
        string str("{\"result\": fasle, \"msg\": \"insert to database failed\"}");
        auto out = base64_encode(str);
            return ctx->send(out.c_str(), ctx->type());
        }
    }
}

int user_login(const HttpContextPtr& ctx)
{
    // 1. 获取登录信息
    auto str = ctx->body();

    // 2. 解密登录信息
    auto out = base64_decode(str);
    Json obj;
    string err;
    int ret = parse_json(out.c_str(), obj, err);
    cout << obj << endl;

    // 检测用户名密码是否正确    
    if(DBAPP->isUserExist(obj["user"])) {
        int id = DBAPP->checkUserPassword(obj["user"], obj["password"]);
        string str("{\"result\": true, \"user_id\":" + to_string(id) + ",\"msg\": \"login successful\"}");
        if(id == -1) {
            str = "{\"result\": false, \"msg\": \"password error\"}";
        }
        auto out = base64_encode(str);
        return ctx->send(out.c_str(), ctx->type());
    }
    else {
        // 用户名错误
        string str("{\"result\": false, \"msg\": \"user is not exist\"}");
        auto out = base64_encode(str);
        return ctx->send(out.c_str(), ctx->type());
    }
}